// This file is part of The Grinder software distribution. Refer to
// the file LICENSE which is part of The Grinder distribution for
// licensing details. The Grinder distribution is available on the
// Internet at http://grinder.sourceforge.net/

package mitm;

/**
 * ConnectionDetails represents the endpoints of a TCP connection,
 * and whether SSL is used.
 *
 */
public class ConnectionDetails {

	private final int m_hashCode;

	private String m_localHost;
	private int m_localPort;
	private String m_remoteHost;
	private int m_remotePort;
	private boolean m_isSecure;

	/**
	 * Creates a new ConnectionDetails instance.
	 */
	public ConnectionDetails(String localHost, int localPort, String remoteHost, int remotePort, boolean isSecure) {
		m_localHost = localHost.toLowerCase();
		m_localPort = localPort;
		m_remoteHost = remoteHost.toLowerCase();
		m_remotePort = remotePort;
		m_isSecure = isSecure;

		m_hashCode = m_localHost.hashCode() ^ m_remoteHost.hashCode() ^ m_localPort ^ m_remotePort
				^ (m_isSecure ? 0x55555555 : 0);
	}

	public String getDescription() {
		return m_localHost + ":" + m_localPort + "->" + m_remoteHost + ":" + m_remotePort;
	}

	public boolean isSecure() {
		return m_isSecure;
	}

	public String getRemoteHost() {
		return m_remoteHost;
	}

	public String getLocalHost() {
		return m_localHost;
	}

	public int getRemotePort() {
		return m_remotePort;
	}

	public int getLocalPort() {
		return m_localPort;
	}

	/**
	 * Value based equality.
	 *
	 * @param other an <code>Object</code> value
	 * @return <code>true</code> => <code>other</code> is equal to this object.
	 *
	 */
	public boolean equals(Object other) {
		if (other == this) {
			return true;
		}

		if (!(other instanceof ConnectionDetails)) {
			return false;
		}

		final ConnectionDetails otherConnectionDetails = (ConnectionDetails) other;

		return hashCode() == otherConnectionDetails.hashCode()
				&& getLocalPort() == otherConnectionDetails.getLocalPort()
				&& getRemotePort() == otherConnectionDetails.getRemotePort()
				&& isSecure() == otherConnectionDetails.isSecure()
				&& getLocalHost().equals(otherConnectionDetails.getLocalHost())
				&& getRemoteHost().equals(otherConnectionDetails.getRemoteHost());
	}

	public final int hashCode() {
		return m_hashCode;
	}

}
